#pragma once

#include <functional>
#include <mutex>
#include <condition_variable>
#include <string>

#include "noncopyable.h"
#include "Thread.h"

class EventLoop;

/**
 * 封装线程和事件循环：创建一个独立的线程，并在该线程中运行一个 EventLoop。
 * 线程安全：通过条件变量和互斥锁，确保线程的创建和销毁是线程安全的。
 * 灵活的初始化：支持用户定义的初始化回调函数，用于在事件循环启动前执行自定义逻辑。
 */
class EventLoopThread : noncopyable
{
public:
    using ThreadInitCallback = std::function<void(EventLoop *)>;

    EventLoopThread(const ThreadInitCallback &cb = ThreadInitCallback(),
                    const std::string &name = std::string());
    ~EventLoopThread();

    EventLoop *startLoop();

private:
    void threadFunc();

    EventLoop *loop_;
    bool exiting_;
    Thread thread_;
    std::mutex mutex_;             // 互斥锁
    std::condition_variable cond_; // 条件变量
    ThreadInitCallback callback_;
};